package pvn.com;

import pvn.com.interfaces.IObjectMessageListener;
import pvn.com.locale.Planex1TraderResource;
import pvn.com.screens.RatesScreen;
import pvn.com.utils.MessageTimer;
import pvn.com.utils.StringSplit;
import java.util.Hashtable;
import net.rim.device.api.browser.field2.BrowserFieldRequest;
import net.rim.device.api.i18n.Locale;
import net.rim.device.api.i18n.ResourceBundle;
import net.rim.device.api.system.Bitmap;
import net.rim.device.api.system.Display;
import net.rim.device.api.ui.UiApplication;
import net.rim.device.api.ui.component.Dialog;

public class Planex1App extends UiApplication implements IObjectMessageListener,
        Planex1TraderResource {
    protected ResourceBundle _res = ResourceBundle.getBundle(7838476468221171405L,
            "pvn.com.locale.FxProTrader");
    RatesScreen wndRates = null;
    ServerConnection server = null;
    MessageTimer tmrPrices = new MessageTimer(this, 11, 333);

    boolean isConnecting = false;
    boolean wasConnected = false;
    boolean stopConnecting = false;
    int currentStep = 0;

    public static void main(String[] args) {
        Planex1App theApp = new Planex1App();
        theApp.enterEventDispatcher();
    }

    public Planex1App() {
        this.wndRates = new RatesScreen();

        // pushScreen(wndRates);
    }

    public void CloseAllScreens() {

        if ((this.wndRates != null) && (this.wndRates.isDisplayed()))
            popScreen(this.wndRates);

    }

    private void ReadServer(String serverInfo) {
        // TODO --- Check
        // if ((this.wndLoginProgress == null) || (!this.wndLoginProgress.isDisplayed()))
        // return;
        String[] vLines = StringSplit.split(serverInfo, "|");

        if (vLines.length != 2) {
            Dialog.alert("Error in server info");
            return;
        }
        String serverAddress = vLines[1];

        String[] vServerArgs = StringSplit.split(serverAddress, ":");
        if (vServerArgs.length != 2) {
            Dialog.alert("Error in server info");
            return;
        }

        ParamsStorage.serverHost = vServerArgs[0];
        ParamsStorage.serverPort = Integer.parseInt(vServerArgs[1]);
    }

    public void GetSettings() {
        this.currentStep = 2;

        String base_url = ParamsStorage.GetBaseUrl();
    }

    private void ReadSettings(String settingsInfo) {
        String[] vLines = StringSplit.split(settingsInfo, "|");
        if (vLines.length < 1) {
            Dialog.alert("Failed to read settings(1)");
            return;
        }

        String symbols = vLines[0];
        String[] vSymbolArgs = StringSplit.split(symbols, ":");
        if (vSymbolArgs.length < 2) {
            Dialog.alert("Failed to read settings(2)");
            return;
        }

        ParamsStorage.PutExtSymbols(vSymbolArgs);
    }
    
    //TODO --- Check lai ham connect toi server.
//    public void ConnectToServer() {
//        this.currentStep = 3;
//        this.server = new ServerConnection(this, this._res);
//        ParamsStorage.server = this.server;
//        this.server.Connect(ParamsStorage.serverHost, ParamsStorage.serverPort);
//    }
//
//    public static void errorDialog(String message, boolean exit) {
//        UiApplication.getUiApplication().invokeLater(new Runnable(message, exit) {
//            private final boolean val$exit;
//
//            public void run() {
//                Dialog.alert(FxProApp.this);
//                if (this.val$exit) {
//                    System.exit(1);
//                }
//            }
//        });
//    }

    // public void OnMsg(int MSG, int WPARAM, Object val) {
    // switch (MSG) {
    // case 8:
    // this.stopConnecting = true;
    // this.wasConnected = false;
    // if (this.currentStep < 2) {
    // if (this.gsServer != null)
    // this.gsServer.stop();
    // any2login();
    // } else if (this.currentStep == 2) {
    // if (this.gsSettings != null)
    // this.gsSettings.stop();
    // any2login();
    // } else {
    // if (this.currentStep <= 2)
    // break;
    // this.server.Disconnect();
    // any2login();
    // }
    //
    // break;
    // case 6:
    // if (this.stopConnecting) {
    // any2login();
    // return;
    // }
    // if (WPARAM == EventID.W_OK) {
    // ReadServer((String) val);
    // GetSettings();
    // } else {
    // new MesageBoxExt(null, "Error", this._res.getString(11) + ": " + val, 0,
    // Display.getWidth() * 3 / 4);
    //
    // if (this.wasConnected)
    // any2progress();
    // else
    // any2login();
    // }
    // this.gsServer = null;
    // break;
    // case 7:
    // if (this.stopConnecting) {
    // any2login();
    // return;
    // }
    // if (WPARAM == EventID.W_OK) {
    // ReadSettings((String) val);
    // ConnectToServer();
    // } else {
    // new MesageBoxExt(null, "Error", this._res.getString(13) + ": " + val, 0,
    // Display.getWidth() * 3 / 4);
    //
    // if (this.wasConnected)
    // any2progress();
    // else
    // any2login();
    // }
    // this.gsSettings = null;
    // break;
    // case 9:
    // if (val == ParamsStorage.server) {
    // if (this.wasConnected) {
    // any2progress();
    // } else {
    // new MesageBoxExt(null, "Error", this._res.getString(11) + ": "
    // + this.server.lastErrorDesc, 0, Display.getWidth() * 3 / 4);
    //
    // any2login();
    // }
    // } else {
    // if (this.wndTradeProgress == null)
    // return;
    // this.wndTradeProgress.SetNotification(StringSplit.split("trade|step|2|6", "|"));
    // }
    // break;
    // case 10:
    // if (this.stopConnecting) {
    // any2login();
    // return;
    // }
    // this.currentStep = 4;
    // this.wndLoginProgress.setStep(4);
    // this.server.SendLogin(ParamsStorage.sLogin, ParamsStorage.sPassword);
    // break;
    // case 17:
    // String symbol_name = (String) val;
    // SymbolInfo si = (SymbolInfo) ParamsStorage.Symbols.get(symbol_name);
    // if (si == null)
    // break;
    // switch (WPARAM) {
    // case 41:
    // this.wndChart.refresh();
    // pushScreen(this.wndChart);
    // this.wndChart.GetChart(si, "1");
    // break;
    // case 26:
    // this.wndTradeInst = new TradeScreen(true, null);
    // this.wndTradeInst.show(si);
    // this.wndTradeInst.refresh();
    // pushScreen(this.wndTradeInst);
    // break;
    // case 27:
    // this.wndTradePend = new TradeScreen(false, null);
    // this.wndTradePend.show(si);
    // this.wndTradePend.refresh();
    // pushScreen(this.wndTradePend);
    // }
    //
    // break;
    // case 26:
    // TradeRecord tr = (TradeRecord) val;
    // this.wndTradeView = new TradeViewScreen(tr);
    // pushScreen(this.wndTradeView);
    // break;
    // case 22:
    // this.wndTradeProgress = new TradeProgess(this);
    // if (WPARAM == EventID.W_OPENTRADE) {
    // this.wndTradeProgress.DoTrade((TradeRecord) val);
    // } else if (WPARAM == EventID.W_CLOSETRADE) {
    // if (this.wndTradeView == null)
    // return;
    // this.wndTradeView.onClose();
    // this.wndTradeView = null;
    // this.wndTradeProgress.DoCloseTrade((TradeRecord) val);
    // this.wndOpen.selectList();
    // } else if (WPARAM == EventID.W_DELETETRADE) {
    // if (this.wndTradeView == null)
    // return;
    // this.wndTradeView.onClose();
    // this.wndTradeView = null;
    // this.wndTradeProgress.DoDeleteTrade((TradeRecord) val);
    // this.wndOpen.selectList();
    // } else {
    // if (WPARAM != EventID.W_UPDATETRADE)
    // break;
    // if (this.wndTradeView == null)
    // return;
    // this.wndTradeView.onClose();
    // this.wndTradeView = null;
    // this.wndTradeProgress.DoUpdateTrade((TradeRecord) val);
    // this.wndOpen.selectList();
    // }
    //
    // break;
    // case 24:
    // if (this.wndTradeProgress == null)
    // return;
    // this.wndTradeProgress.onClose();
    // this.wndTradeProgress = null;
    // break;
    // case 12:
    // CloseAllScreens();
    // switch (WPARAM) {
    // case 20:
    // this.wndRates.refresh();
    // this.wndRates.setFocusedButton(WPARAM);
    // pushScreen(this.wndRates);
    // this.wndRates.selectList();
    // break;
    // case 21:
    // this.wndFavs.refresh();
    // this.wndFavs.setFocusedButton(WPARAM);
    // pushScreen(this.wndFavs);
    // this.wndFavs.selectList();
    // break;
    // case 22:
    // this.wndOpen.refresh();
    // this.wndOpen.setFocusedButton(WPARAM);
    // pushScreen(this.wndOpen);
    // this.wndOpen.selectList();
    // break;
    // case 35:
    // this.wndHist.refresh();
    // this.wndHist.setFocusedButton(WPARAM);
    // pushScreen(this.wndHist);
    // this.wndHist.selectList();
    // break;
    // case 34:
    // try {
    // String currentSysLang = Locale.getDefaultForSystem().getLanguage();
    //
    // if ((currentSysLang == "zh") || (currentSysLang == "zh_CN")
    // || (currentSysLang == "zh_HK")) {
    // currentSysLang = "cn";
    // }
    // BrowserFieldRequest request = new BrowserFieldRequest(
    // "https://news.fxpro.com/?lang=" + currentSysLang);
    // this.wndWebNews = new WebNewsScreen(request, true);
    // this.wndWebNews.setFocusedButton(WPARAM);
    // pushScreen(this.wndWebNews);
    // } catch (Exception e) {
    // errorDialog("An error occurred, exiting News Page: " + e.toString(), true);
    // }
    //
    // case 99:
    // try {
    // String currentSysLang = Locale.getDefaultForSystem().getLanguage();
    //
    // if ((currentSysLang == "zh") || (currentSysLang == "zh_CN")
    // || (currentSysLang == "zh_HK")) {
    // currentSysLang = "cn";
    // }
    // BrowserFieldRequest request = new BrowserFieldRequest(
    // "https://direct.fxpro.com/?lang=" + currentSysLang);
    // this.wndDirect = new DirectScreen(request, true);
    // this.wndDirect.setFocusedButton(WPARAM);
    // pushScreen(this.wndDirect);
    // } catch (Exception e) {
    // errorDialog("An error occurred, exiting News Page: " + e.toString(), true);
    // }
    // }
    //
    // break;
    // case 11:
    // if (this.wndRates.isVisible()) {
    // this.wndRates.priceUpdate();
    // } else if (this.wndFavs.isVisible()) {
    // this.wndFavs.priceUpdate();
    // } else if (this.wndOpen.isVisible()) {
    // ParamsStorage.trades.UpdateProfits(false);
    // this.wndOpen.priceChanged();
    // }
    //
    // if ((this.wndTradeInst != null) && (this.wndTradeInst.isVisible())) {
    // this.wndTradeInst.priceChanged();
    // } else if ((this.wndTradePend != null) && (this.wndTradePend.isVisible())) {
    // this.wndTradePend.priceChanged();
    // } else {
    // if ((this.wndTradeView == null) || (!this.wndTradeView.isVisible()))
    // break;
    // ParamsStorage.trades.UpdateProfits(false);
    // this.wndTradeView.priceChanged();
    // }
    // break;
    // case 13:
    // this.wndSymbolOptions = new SymbolOptionsScreen(val.toString());
    // pushScreen(this.wndSymbolOptions);
    // break;
    // case 25:
    // this.wndSymbolOptions = null;
    // break;
    // case 14:
    // if ((this.wndSymbolOptions != null) && (this.wndSymbolOptions.isDisplayed())) {
    // popScreen(this.wndSymbolOptions);
    // this.wndSymbolOptions = null;
    // }
    // this.wndFavs.rebind();
    // break;
    // case 28:
    // int scrnCount = getScreenCount();
    // if (scrnCount != 1)
    // break;
    // if (this.server == null)
    // break;
    // this.server.Disconnect();
    // case 15:
    // case 16:
    // case 18:
    // case 19:
    // case 20:
    // case 21:
    // case 23:
    // case 27:
    // }
    // }

    public void OnInputData(String[] cmdArgs, ServerConnection conn) {
        if (this.stopConnecting) {
            return;
        }
        if (cmdArgs.length == 0)
            return;
        if ((cmdArgs[0].compareTo("auth") == 0) && (this.isConnecting)) {
            if (cmdArgs[1].compareTo("ok") == 0) {
                // this.wndLoginProgress.setStep(5);
            } else if ((cmdArgs[1].compareTo("error") == 0) && (cmdArgs.length > 3)) {
                // conn.Disconnect();
                Dialog.alert(cmdArgs[2]);
                // any2login();
            } else {
                // conn.Disconnect();
                Dialog.alert(this._res.getString(16));
                // any2login();
            }

        } else if (cmdArgs[0].compareTo("symbols") == 0) {
            // if (this.wndLoginProgress != null) {
            // this.wndLoginProgress.setStep(6);
            this.wndRates.rebind();
            // } else {
            this.wndRates.rebind();
            // }

        } else if (cmdArgs[0].compareTo("symgroups") == 0) {
            // if (this.wndLoginProgress != null) {
            // this.wndLoginProgress.setStep(7);
            this.wndRates.rebind();
            // } else {
            this.wndRates.rebind();
            // }
            // } else if (cmdArgs[0].compareTo("trades_list") == 0) {
            // this.wndOpen.UpdateTradesList();
            // } else if (cmdArgs[0].compareTo("margin") == 0) {
            // if (this.isConnecting) {
            // this.wndLoginProgress.setStep(8);
            // this.wndOpen.UpdateTradesList();
            // conn.SendReady();
            // }
            //
            // } else if (cmdArgs[0].compareTo("ready") == 0) {
            // this.wasConnected = true;
            // } else if (cmdArgs[0].compareTo("QUOTE") == 0) {
            // if (this.isConnecting) {
            // this.isConnecting = false;
            // progress2done();
            // return;
            // }
            //
            // } else if ((cmdArgs[0].compareTo("trade_add") == 0)
            // || (cmdArgs[0].compareTo("trade_del") == 0)
            // || (cmdArgs[0].compareTo("trade_act") == 0)) {
            // this.wndOpen.UpdateTrades();
            // } else if (cmdArgs[0].compareTo("chart") != 0) {
            // if ((cmdArgs[0].compareTo("trade") == 0) || (cmdArgs[0].compareTo("trade_cancel") ==
            // 0)
            // || (cmdArgs[0].compareTo("trade_close") == 0)
            // || (cmdArgs[0].compareTo("trade_delete") == 0)) {
            // if (this.wndTradeProgress != null)
            // this.wndTradeProgress.SetNotification(cmdArgs);
            // }
            // }
        }
    }

    public void OnMsg(int paramInt1, int paramInt2, Object paramObject) {
        // TODO Auto-generated method stub

    }
}